package com.fl.boot.controller.admin;

import com.fl.boot.common.Result.Result;
import com.fl.boot.pojo.dto.AdminDTO;
import com.fl.boot.pojo.dto.AdminLoginDTO;
import com.fl.boot.pojo.dto.AdminQueryDTO;
import com.fl.boot.pojo.dto.PasswordEditDTO;
import com.fl.boot.pojo.entity.Admin;
import com.fl.boot.pojo.vo.AdminLoginVo;
import com.fl.boot.pojo.vo.AdminSelectVo;
import com.fl.boot.service.AdminService;
import com.fl.boot.common.utils.JwtUtil;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * @author: FL
 * @create: 2024 2024/3/25 18:35
 */
@RestController
@RequestMapping("/admin")
@Slf4j
@Tag(name = "管理员管理")
public class AdminController {
    @Autowired
    private AdminService adminService;

    /**
     * 处理管理员登录请求。
     *
     * @param adminLoginDTO 包含登录所需信息的数据传输对象，如用户名和密码。
     * @RequestBody 接收前端传来的json数据。
     * @return 返回一个结果对象，其中包含管理员登录信息和生成的JWT令牌。
     */
    @PostMapping("/login")
    public Result<AdminLoginVo> login(@RequestBody AdminLoginDTO adminLoginDTO) {
        log.info("员工登录：{}", adminLoginDTO);
        Admin admin = adminService.login(adminLoginDTO);
        //登录成功后，生成jwt令牌
        String token = JwtUtil.createToken(admin.getId());


        AdminLoginVo adminLoginVo = AdminLoginVo.builder()
                .id(admin.getId())
                .password(admin.getPassword())
                .name(admin.getName())
                .username(admin.getUsername())
                .token(token)
                .phone(admin.getPhone())
                .email(admin.getEmail())
                .build();

        return Result.success(adminLoginVo);
    }

    /**
     * 处理管理员登出请求。
     * @return 返回一个结果对象，表示登出操作成功。
     */
    @PostMapping("/logout")
    @Operation(tags ="管理员登出")
    public Result<String> logout() {
        log.info("管理员登出...");
        return Result.success();
    }

    /**
     * 处理新增管理员请求。
     */
    @PostMapping
    @Operation(tags ="新增管理员")
    public Result<String> save(@RequestBody AdminDTO adminDTO) {
        log.info("新增管理员：{}", adminDTO);
        adminService.save(adminDTO);
        return Result.success();
    }


    /**
     * 处理管理员信息更新请求。
     * @param adminDTO 包含更新信息的管理员对象。
     * @return 返回一个结果对象，表示更新操作成功。
     */
    @PutMapping
    @Operation(tags ="管理员修改信息")
    public Result<String> update(@RequestBody AdminDTO adminDTO) {
        log.info("管理员修改信息：{}", adminDTO);
        adminService.update(adminDTO);
        return Result.success();
    }

    /**
     * 动态查询管理员列表
     */
    @GetMapping("")
    @Operation(tags ="管理员列表")
    public Result<List<AdminSelectVo>> list(@RequestBody AdminQueryDTO adminQueryDTO) {
        log.info("查询管理员列表{}", adminQueryDTO);
        List<AdminSelectVo> list = adminService.list(adminQueryDTO);
        return Result.success(list);
    }

    /**
     * 启用/禁用管理员账号。
     */
    @PostMapping("/status/{status}")
    @Operation(tags = "管理员管理")
    public Result<String> enable(@RequestParam Long id, @RequestParam Integer status) {
        log.info("启用/禁用管理员账号：id={}, status={}", id, status);
        adminService.enable(id, status);
        return Result.success();
    }

    /**
     * 修改角色
     */
    @PostMapping("/editRole")
    @Operation(tags ="管理员修改角色")
    public Result<String> editRole(@RequestParam Long id, @RequestParam Integer role) {
        log.info("修改角色：id={}, role={}", id, role);
        adminService.editRole(id, role);
        return Result.success();
    }



    /**
     * 修改密码
     */
    @PostMapping("/editPassword")
    @Operation(tags ="管理员修改密码")
    public Result<String> editPassword(@RequestBody PasswordEditDTO passwordEditDTO) {
        log.info("修改密码：{}", passwordEditDTO);
        adminService.editPassword(passwordEditDTO);
        return Result.success();
    }


}
